/**
 * 其他设置功能模块
 * buaa网络连接设置
 * 
 * 这个模块包含了网络测速的核心逻辑。它通过IPC与主进程通信，
 * 并使用Electron的API来获取网络信息。测速结果通过IPC传递给渲染进程，
 * 并在UI上显示。
 */

const { ipcRenderer } = require('electron');
const { handleError, ErrorTypes, tryCatch } = require('../../common/error-handler');
const { showToast } = require('../../common/show-toast');
const { OtherChannels} = require('../../common/ipc-channels');



// 设置项事件处理
const autoStartCheckbox = document.getElementById('auto-start');
const autoConnectCheckbox = document.getElementById('auto-connect');
const saveSettingsButton = document.getElementById('save-settings');
const resetSettingsButton = document.getElementById('reset-settings');

// 处理用户名和密码输入
const usernameInput = document.getElementById('username');
const passwordInput = document.getElementById('password');
const togglePasswordButton = document.getElementById('toggle-password');

// 密码显示/隐藏功能
if (togglePasswordButton) {
    togglePasswordButton.addEventListener('click', function () {
        const passwordInput = document.getElementById('password');
        const type = passwordInput.getAttribute('type') === 'password' ? 'text' : 'password';
        passwordInput.setAttribute('type', type);

        // 更新图标
        const icon = this.querySelector('i');
        if (type === 'text') {
            icon.classList.remove('fa-eye');
            icon.classList.add('fa-eye-slash');
            this.setAttribute('title', '隐藏密码');
        } else {
            icon.classList.remove('fa-eye-slash');
            icon.classList.add('fa-eye');
            this.setAttribute('title', '显示密码');
        }

        // 添加动画效果
        this.classList.add('pulse-animation');
        setTimeout(() => {
            this.classList.remove('pulse-animation');
        }, 500);
    });
}

// 用户名输入处理
usernameInput.addEventListener('input', (e) => {
    e.preventDefault();
    const value = e.target.value;
    console.log('[用户输入] 用户名更新:', value ? '已输入' : '空');

    // 验证用户名
    if (value && value.length >= 3) {
        e.target.classList.add('is-valid');
        e.target.classList.remove('is-invalid');
    } else if (value && value.length > 0) {
        e.target.classList.add('is-invalid');
        e.target.classList.remove('is-valid');
    } else {
        e.target.classList.remove('is-valid', 'is-invalid');
    }
});

// 密码输入处理
passwordInput.addEventListener('input', (e) => {
    e.preventDefault();
    const value = e.target.value;
    console.log('[用户输入] 密码更新:', value ? '已输入' : '空');

    // 验证密码
    if (value && value.length >= 6) {
        e.target.classList.add('is-valid');
        e.target.classList.remove('is-invalid');
    } else if (value && value.length > 0) {
        e.target.classList.add('is-invalid');
        e.target.classList.remove('is-valid');
    } else {
        e.target.classList.remove('is-valid', 'is-invalid');
    }
});

// 保存设置按钮点击事件
saveSettingsButton.addEventListener('click', function () {
    const username = usernameInput.value;
    const password = passwordInput.value;

    // 验证输入
    if (!username || !password) {
        showToast('用户名和密码不能为空', 'error');
        return;
    }

    // 发送保存请求到主进程
    ipcRenderer.send('save-settings', {
        username,
        password,
        autoStart: autoStartCheckbox.checked,
        autoConnect: autoConnectCheckbox.checked
    });

    showToast('设置已保存', 'success');
});

// 重置设置按钮点击事件
resetSettingsButton.addEventListener('click', function () {
    // 确认对话框
    if (confirm('确定要重置所有设置吗？这将清除您保存的用户名、密码和偏好设置。')) {
        // 清空输入框
        usernameInput.value = '';
        passwordInput.value = '';

        // 重置复选框
        autoStartCheckbox.checked = false;
        autoConnectCheckbox.checked = false;

        // 移除输入框验证状态
        usernameInput.classList.remove('is-valid', 'is-invalid');
        passwordInput.classList.remove('is-valid', 'is-invalid');

        // 发送重置请求到主进程
        ipcRenderer.send('reset-settings');

        // 显示成功提示
        showToast('所有设置已重置', 'success');
        document.getElementById('settings-status').textContent = '设置已重置';

        // 添加按钮动画效果
        resetSettingsButton.classList.add('btn-animated');
        setTimeout(() => {
            resetSettingsButton.classList.remove('btn-animated');
        }, 500);
    }
});

// 监听配置加载
ipcRenderer.on('config-loaded', (event, config) => {
    console.log('[配置加载] 开始加载配置');
    if (config) {
        console.log('[配置详情]', {
            自动启动: config.autoStart,
            自动连接: config.autoConnect,
            用户名存在: !!config.username,
            密码存在: !!config.password
        });

        autoStartCheckbox.checked = config.autoStart;
        autoConnectCheckbox.checked = config.autoConnect;

        if (config.username) {
            console.log('[配置加载] 已加载保存的用户名');
            usernameInput.value = config.username;
        }
        if (config.password) {
            console.log('[配置加载] 已加载保存的密码');
            passwordInput.value = config.password;
        }
    } else {
        console.log('[配置加载] 无可用配置');
    }
});

// 处理开机自启动设置
autoStartCheckbox.addEventListener('change', function (e) {
    console.log('设置开机自启动:', e.target.checked);
    ipcRenderer.send('set-auto-start', e.target.checked);
});

// 监听开机自启动设置结果
ipcRenderer.on('auto-start-set', (event, enabled) => {
    console.log('开机自启动设置结果:', enabled);
    autoStartCheckbox.checked = enabled;
});

// 处理自动连接网络设置
autoConnectCheckbox.addEventListener('change', function (e) {
    console.log('设置自动连接网络:', e.target.checked);
    ipcRenderer.send('set-auto-connect', e.target.checked);
});

// 监听自动连接设置结果
ipcRenderer.on('auto-connect-set', (event, enabled) => {
    console.log('自动连接设置结果:', enabled);
    autoConnectCheckbox.checked = enabled;
    showToast(`${enabled ? '已开启' : '已关闭'}自动连接网络`, 'success');
});

// 监听自动连接请求
ipcRenderer.on('trigger-connect', (event, { username, password }) => {
    console.log('[自动连接] 收到自动连接触发请求');

    // 确保用户名和密码已设置
    if (username && password) {
        // 设置输入框的值
        usernameInput.value = username;
        passwordInput.value = password;

        // 触发连接
        console.log('[自动连接] 执行连接操作');
        const connectButton = document.getElementById('connect-network');
        if (connectButton && !connectButton.disabled) {
            connectButton.click();
        }
    } else {
        console.log('[自动连接] 失败：缺少用户名或密码');
        showToast('自动连接失败：未设置用户名或密码', 'error');
    }
});

// 监听网络状态变化
ipcRenderer.on('network-status', (event, status) => {
    console.log('[网络状态] 状态更新:', status);
    console.log('[状态详情]', {
        时间: new Date().toLocaleString(),
        状态: status,
        详细信息: typeof status === 'object' ? status : { 状态: status }
    });
});

// 监听登录过程
ipcRenderer.on('login-process', (event, data) => {
    console.log('[登录过程] 状态更新:', data.step);
    console.log('[过程详情]', {
        步骤: data.step,
        时间: new Date().toLocaleString(),
        详情: data.details || '无'
    });
});

// 监听自动重连
ipcRenderer.on('auto-reconnect', (event, data) => {
    console.log('[自动重连] 触发重连');
    console.log('[重连详情]', {
        时间: new Date().toLocaleString(),
        尝试次数: data.attempt,
        状态: data.status,
        下次重试: data.nextRetry
    });
});

// 监听来自主进程的 toast 消息
ipcRenderer.on('show-toast', (event, { message, type }) => {
    showToast(message, type);
});
// 监听连接状态
// 连接网络
function initialize() {
    // 初始化网络连接
    console.log('========== 初始化网络连接 ==========');
    console.log('[初始化] 准备获取网络状态');
    ipcRenderer.send('get-network-status');
    // 处理网络连接
    document.getElementById('connect-network').addEventListener('click', function () {
        console.log('========== 开始网络连接流程 ==========');
        console.time('网络连接耗时');

        const username = usernameInput.value;
        const password = passwordInput.value;
        const connectButton = this;

        // 连接状态追踪
        let connectionState = {
            isConnecting: false,
            startTime: null,
            timeoutId: null,
            hasResponse: false,
            isSuccess: false
        };

        console.log('[输入验证] 检查用户名和密码');
        if (!username || !password) {
            console.log('[输入验证] 失败：用户名或密码为空');
            console.log('[UI更新] 显示错误提示');
            showToast('用户名或密码不能为空', 'error');
            return;
        }
        console.log('[输入验证] 通过：用户名和密码均已填写');

        // 防止重复点击
        if (connectionState.isConnecting) {
            console.log('[状态检查] 已有连接请求正在进行中');
            showToast('请等待当前连接完成', 'info');
            return;
        }

        console.log('[UI更新] 更新按钮状态为禁用');
        connectButton.disabled = true;
        connectButton.textContent = '正在连接...';

        // 更新连接状态
        connectionState.isConnecting = true;
        connectionState.startTime = Date.now();
        connectionState.hasResponse = false;
        connectionState.isSuccess = false;

        // 设置超时处理
        connectionState.timeoutId = setTimeout(() => {
            if (!connectionState.hasResponse) {
                console.log('[超时处理] 连接请求超时');
                handleConnectionError('连接超时，请重试');
            }
        }, 10000); // 10秒超时

        // 发送连接请求到主进程
        console.log('[网络请求] 准备发送连接请求');
        console.log(`[网络请求] 参数: 用户名=${username}, 密码长度=${password.length}`);

        try {
            ipcRenderer.send(OtherChannels.CONNECT_NETWORK, { username, password });
            console.log('[网络请求] 请求已发送');
        } catch (error) {
            console.log('[网络请求] 发送失败:', error);
            handleConnectionError('请求发送失败');
            return;
        }

        function handleConnectionError(message) {
            console.log(`[错误处理] ${message}`);
            connectionState.isConnecting = false;
            connectionState.hasResponse = true;
            connectionState.isSuccess = false;

            if (connectionState.timeoutId) {
                clearTimeout(connectionState.timeoutId);
            }

            connectButton.disabled = false;
            connectButton.textContent = '手动连接网络';
            showToast(message, 'error');
            console.timeEnd('网络连接耗时');
        }

        // 监听连接结果
        ipcRenderer.on('login-success', () => {
            console.log('[连接结果] 连接成功-login-success');
            connectionState.hasResponse = true;
            connectionState.isSuccess = true;

            if (connectionState.timeoutId) {
                clearTimeout(connectionState.timeoutId);
            }

            connectButton.disabled = false;
            connectButton.textContent = '手动连接网络';
            showToast('网络连接成功', 'success');
            console.timeEnd('网络连接耗时');
        });

        ipcRenderer.once('login-failed', () => {
            console.log('[连接结果] 连接失败 -login-failed');
            handleConnectionError('网络连接失败，请检查用户名和密码');
        });

        ipcRenderer.once('login-error', (event, message) => {
            console.log('[连接结果] 连接错误-login-error:', message);
            handleConnectionError(`连接错误: ${message}`);
        });
    });
    
    // 添加网络状态显示更新
    const networkStatusElement = document.getElementById('network-status');
    if (networkStatusElement) {
        // 监听网络状态更新
        ipcRenderer.on('network-status-update', (event, status) => {
            console.log('[网络状态更新]', status);
            networkStatusElement.textContent = status.message || '未知状态';
            
            // 根据状态设置颜色
            if (status.connected) {
                networkStatusElement.style.color = '#27ae60'; // 绿色
            } else {
                networkStatusElement.style.color = '#e74c3c'; // 红色
            }
        });
    }
}

// 导出模块
module.exports = {
    initialize
};